﻿#define _CRT_SECURE_NO_WARNINGS 1

////2023_7_28 操作符章节 （算术转换）

//输入描述：多组输入，一行有两个整数，分别表示年份和月份，用空格分隔。
//输出描述：针对每组输入，输出为一行，一个整数，表示这一年这个月有多少天。
//示例
//输入：2008 2
//输出：29
// //方法一：
//#include <stdio.h>
//int is_leap_year(int y)
//{
//	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
//		return 1;
//	else
//		return 0;
//}
//int main()
//{
//	int y = 0;
//	int m = 0;
//	scanf("%d %d", &y, &m);
//	int d = 0;
//	if (m >= 1 && m <= 12)
//	{
//		switch (m)
//		{
//		case 1:
//		case 3:
//		case 5:
//		case 7:
//		case 8:
//		case 10:
//		case 12:
//			d = 31;
//			break;
//		case 4:
//		case 6:
//		case 9:
//		case 11:
//			d = 30;
//			break;
//		case 2:
//			d = 28;
//			break;
//		}
//		if (is_leap_year(y) && (m == 2))
//			d++;
//		printf("%d\n", d);
//	}
//	else
//		printf("月份输入错误\n");
//	return 0;
//}

// //方法二：
//#include <stdio.h>
//int is_leap_year(int y)
//{
//	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
//		return 1;
//	else
//		return 0;
//}
//int main()
//{
//	int y = 0;
//	int m = 0;
//	while (scanf("%d %d", &y, &m) == 2)
//	{
//		if (m >= 1 && m <= 12)
//		{
//			int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//多写一个0，是为了让下标1对上一月份。
//			if (is_leap_year(y) && m == 2)
//				arr[m]++;
//			printf("%d\n", arr[m]);
//		}
//		else
//			printf("月份输入错误\n");
//	}
//	return 0;
//}


////变种水仙花数 - Lily Number：把任意的数字，从中间拆分成两个数字， 如果所有拆分后的乘积之和等于自身，则是一个Lily Number。
////例如：
////655 = 6 * 55 + 65 * 5
////1461 = 1 * 461 + 14 * 61 + 146 * 1
////求出 5位数中的所有 Lily Number。
//#include <stdio.h>
//#include <math.h>
//int sum_of_i(int i)
//{
//	int j = 0;
//	int sum = 0;
//	for (j = 1; j <= 4; j++)
//	{
//		sum += (i / (int)pow(10, j)) * (i % (int)pow(10, j));//%的操作数只能为整数。若求商的整数部分，则操作数一定不能为小数。
//	}
//	return sum;
//}
//int main()
//{
//	int i = 0;
//	for (i = 10000; i <= 99999; i++)
//	{
//		//求拆分后的乘积之和
//		int ret = sum_of_i(i);
//		//判断是否为Lily Number
//		if (ret == i)
//			printf("%d ", i);
//	}
//	
//	return 0;
//}



////2023_7_29 初阶指针

////写一个函数打印arr数组的内容，不使用数组下标，使用指针。
////arr是一个整形一维数组。
//#include <stdio.h>
//void print(int* p, int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		//printf("%d ", *p++);
//		//printf("%d ", *(p + i));
//		//printf("%d ", p[i]);
//		printf("%d ", i[p]);
//
//	}
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//打印
//	print(arr, sz);
//	return 0;
//}


////将一个字符串str的内容颠倒过来，并输出。
////数据范围：1≤len(str)≤10000
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str[10001] = { 0 };//还要给'\0'留一个空间。
//	//scanf("%[^\n]", str);
//	//gets(str);
//	char ch = 0;
//	int j = 0;
//	while ((ch = getchar()) != '\n')
//	{
//		str[j++] = ch;
//	}
//	size_t sl = strlen(str);
//	char* start = str;
//	char* end = start + sl - 1;
//	int i = 0;
//	while (start < end)
//	{
//		char tmp = *start;
//		*start = *end;
//		*end = tmp;
//		start++;
//		end--;
//	}
//	printf("%s\n", str);
//	return 0;
//}


////打印菱形
//#include <stdio.h>
//int main()
//{
//	int line = 7;
//	int i = 0;
//	int j = 0;
//	//上半部分
//	for (i = 0; i < line; i++)
//	{
//		//打印空格
//		for (j = 0; j < line - 1 - i; j++)
//		{
//			printf(" ");
//		}
//		//打印*
//		for (j = 0; j < 2 * i + 1; j++)
//		{
//			printf("*");
//		}
//		//换行
//		printf("\n");
//	}
//	//下半部分
//	for (i = 0; i < line - 1; i++)
//	{
//		//打印空格
//		for (j = 0; j < i + 1; j++)
//		{
//			printf(" ");
//		}
//		//打印*
//		for (j = 0; j < (2 * (line - 1 - i) - 1); j++)
//		{
//			printf("*");
//		}
//		//换行
//		printf("\n");
//	}
//	return 0;
//}


////自己的原始方法
//#include <stdio.h>
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 7; i++)
//	{
//		for (j = 1; j <= 6 - i; j++)
//		{
//			printf("  ");
//		}
//		for (j = 7 - i; j <= 7 + i; j++)
//		{
//			printf("* ");
//
//
//		}
//		printf("\n\n");
//	}
//
//
//	for (i = 5; i >= 0; i--)
//	{
//		char a = '*';
//		char* pa = &a;
//		for (j = 1; j <= 6 - i; j++)
//		{
//			printf("  ");
//		}
//		for (j = 7 - i; j <= 7 + i; j++)
//		{
//			printf("* ");
//
//
//		}
//		printf("\n\n");
//	}
//	return 0;
//}


////打印水仙花数（自幂数）
////求出0～100000之间的所有“水仙花数”并输出。
////“水仙花数”（自幂数）是指一个n位数，其各位数字的n次方之和确好等于该数本身，如 : 153＝1 ^ 3＋5 ^ 3＋3 ^ 3，则153是一个“水仙花数”。
//#include <stdio.h>
//#include <math.h>
////int digit(int i)
////{
////	int n = 0;
////	while (i)
////	{
////		i /= 10;
////		n++;
////	}
////	return n;
////}
//
//int digit(int i)
//{
//	int n = 1;
//	while (i /= 10)
//	{
//		n++;
//	}
//	return n;
//}
//int sum_of_digit_pow(int i, int n)
//{
//	int sum = 0;
//	while (i)
//	{
//		sum += (int)pow(i % 10, n);
//		i /= 10;
//	}
//	return sum;
//}
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 100001; i++)
//	{
//		//求出位数n。
//		int n = digit(i);
//		//求出各位数字的n次方之和。
//		int sum = sum_of_digit_pow(i, n);
//		//判断i是不是自幂数。
//		if (sum == i)
//		{
//			printf("%d ", i);
//		}
//	}
//	return 0;
//}





////自己原来的方法
//#include <stdio.h>
//#include <math.h>
//
////int num(int i)
////{
////	int count = 0;
////	while (i > 0)
////	{
////		i /= 10;
////		count++;
////	}
////	return count;
////}
//
//
//int num(int i)
//{
//	if (i == 0)
//		return 0;
//	else
//		return 1 + num(i / 10);
//}
//
//
//int sum(int i, int ret_num)
//{
//	if (i == 0)
//	{
//		return 0;
//	}
//	else
//	{
//		return (sum(i / 10, ret_num)) + ((int)pow((i % 10), ret_num));
//	}
//}
//
//
//int main()
//{
//	int count = 0;
//	int i = 0;
//	for (i = 0; i <= 100000; i++)
//	{
//		//求出i位数。
//		int ret_num = num(i);
//		//求出i的每一位ret_num次方之和。
//		int ret_sum = sum(i, ret_num);
//		if (i == ret_sum)
//		{
//			printf("%d ", ret_sum);
//			count++;
//		}
//	}
//	printf("\ncount = %d", count);
//	return 0;
//}


//////计算求和
////求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和，其中a是一个数字。
////例如：2 + 22 + 222 + 2222 + 22222
//#include <stdio.h>
//
//int sum_of(int a, int n)
//{
//	int k = 0;
//	int sum = 0;
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		k = k * 10 + a;
//		sum += k;
//	}
//	return sum;
//}
//int main()
//{
//	int a = 0;
//	int n = 5;
//	scanf("%d", &a);
//	int sum = sum_of(a, n);
//	printf("%d\n", sum);
//	return 0;
//}


////自己原来的方法
//﻿//#include <stdio.h>
////int main()
////{
////	int a = 0;
////	scanf("%d", &a);
////	int Sn = a + (a * 10 + a) + (a * 100 + a * 10 + a) + (a * 1000 + a * 100 + a * 10 + a) + (a * 10000 + a * 1000 + a * 100 + a * 10 + a);
////	printf("%d\n", Sn);
////	return 0;
////}
//
//
//#include <stdio.h>
//#include <math.h>
//int Sn_sum(int a, int num, int i)
//{
//	if (6 == i)
//		return 0;
//	else
//		return num + Sn_sum(a, (num + a * (int)pow(10, i)), i + 1);
//}
//int main()
//{
//	int a = 0;
//	int i = 1;
//	scanf("%d", &a);
//	int num = a;
//	int Sn = Sn_sum(a, num, i);
//	printf("%d\n", Sn);
//	return 0;
//}



//////2023_7_31结构体（的声明等）
//
////喝汽水问题
////喝汽水，1瓶汽水1元，2个空瓶可以换一瓶汽水，给20元，可以喝多少汽水（编程实现）。
//#include <stdio.h>
//int main()
//{
//	int money = 0;
//	scanf("%d", &money);
//	int total = money;
//	int empty = total;
//	while (empty > 1)
//	{
//		total += empty / 2;
//		empty = empty / 2 + empty % 2;
//	}
//	printf("%d\n", total);
//	return 0;
//}



////2023_8_1  实用调试技巧  （const修饰指针等）

//调整奇数偶数顺序
//调整数组使奇数全部都位于偶数前面。
//题目：
//输入一个整数数组，实现一个函数，
//来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分，
//所有偶数位于数组的后半部分。

//#include <stdio.h>
////void odd_even(int arr[], int sz)
////{
////	int* left = arr;
////	int* right = arr + sz - 1;
////	while (left < right)
////	{
////		while (left < right)
////		{
////			if (*left % 2 == 1)
////			{
////				left++;
////			}
////			break;
////		}
////		while (left < right)
////		{
////			if (*right % 2 == 0)
////			{
////				right--;
////			}
////			break;
////		}
////		if (left < right)
////		{
////			int tmp = *left;
////			*left = *right;
////			*right = tmp;
////		}
////	}
////}
//
//void odd_even(int arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//	arr[left] = *arr;
//	arr[right] = *(arr + sz - 1);
//	while (left < right)0
//	{	
//		//从前向后找一个偶数
//		while (left < right && arr[left] % 2 == 1)
//		{
//			left++;
//		}
//		//从前往后找一个奇数
//		while (left < right && arr[right] % 2 == 0)
//		{
//			right--;
//		}
//		//交换
//		if (left < right)
//		{
//			int tmp = arr[left];
//			arr[left] = arr[right];
//			arr[right] = tmp;
//			left++;
//			right--;
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	odd_even(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}



////2023_8_2 深度刨析数据在内存中的存储，const的用法。

//猜凶手
//以下为4个嫌疑犯的供词:
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//已知3个人说了真话，1个人说的是假话。
//现在请根据这些信息，写一个程序来确定到底谁是凶手。
// 
//#include <stdio.h>
//int main()
//{
//	int killer = 0;
//	for (killer = 'A'; killer <= 'D'; killer++)
//	{
//		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
//		{
//			printf("killer = %c\n", killer);
//		}
//	}
//	return 0;
//}